home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
dskut
/
800ks.zip
/
800KFMAT.ASM
< prev
next >
Wrap
Assembly Source File
|
1987-11-02
|
9KB
|
624 lines
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
START: JMP GO
;-------------------------------------------
EVEN
DW 128 DUP (0)
STKTOP DW 0
CYLPERDSK EQU 80
BYTESPERSEC EQU 512
SECPERCLUS EQU 2
RESERVEDSEC EQU 1
NMBROFFATS EQU 2
ROOTENTRIES EQU 112
SECPERDISK EQU 1600
DESCRIPTOR EQU 0F0H
SECPERFAT EQU 3
SECPERTRK EQU 10
NMBROFHEADS EQU 2
HIDDENSEC EQU 0
DSM EQU 57H
OLD_DISKBASE DD 0
OLD23 DD 0
CYL DB 0
HEAD DB 0
SECT DB 0
RETRY_COUNT DW 0
DRIVE DB 0
BREAK DB 0
DISKBASE DB 0DFH
DB 02H
DB 25H
DB 02H
DB SECPERTRK
DB 1BH
DB 0FFH
DB 28H ;format gap
DB 00H ;fill byte
DB 0FH
DB 08H
; C H R N
SA DB 0,0,1,2
DB 0,0,2,2
DB 0,0,3,2
DB 0,0,4,2
DB 0,0,5,2
DB 0,0,6,2
DB 0,0,7,2
DB 0,0,8,2
DB 0,0,9,2
DB 0,0,10,2
MSG1 DB 0DH,0AH,'Format successful.',0DH,0AH,24H
MSG2 DB 0DH,0AH,'Format failed - track 0 unusable.',0DH,0AH,24H
MSG3 DB 0DH,'Cylinder '
MSG3A DB ' ',' '
DB 'Head '
MSG3B DB ' ',24H
MSG4 DB ' - error on this track.',0Dh,0Ah,24h
MSG5 DB 0DH,0AH,'Format failed - error reading boot sector'
DB ' from default drive.',0Dh,0Ah,24h
MSG6 DB 'Drive letter (A: or B:) must be specified.',0Dh,0Ah,24h
MSG7 DB 'Insert diskette and press a key when ready '
DB '(or <ESC> to abort).',0Dh,0Ah,24h
MSG8 DB 0DH,0AH,'Terminated by control-break.',0DH,0AH,24H
LOGO DB '800 k byte formatter for low-density diskettes'
DB ' in PC/AT high-density drive',0Dh,0Ah
DB 'Version 1.0 - Copyright (C) 1987, Alan D. Jones',0Dh,0Ah,0Ah
DB 'Use memory-resident program "800K" to write & read '
DB 'these diskettes.',0Dh,0Ah,0Ah,24h
CRLF DB 0DH,0AH,24H
EVEN
BOOTIMG DB 512 DUP (0)
FAT DB DESCRIPTOR,0FFH,0FFH
DB 509 DUP (0)
DB 512 DUP (0)
DB 512 DUP (0)
;-------------------------------------------
;ctrl-break routine
INT23 PROC FAR
MOV CS:BREAK,1
IRET
INT23 ENDP
;-------------------------------------------
;routine to assure proper setting of
; "diskette state machine" byte
DSMS PROC
PUSH ES
PUSH BX
PUSH AX
MOV AX,40H
MOV ES,AX
MOV BX,90H
ADD BL,DRIVE
MOV AL,ES:[BX]
AND AL,0DFH
OR AL,07H
MOV ES:[BX],AL
POP AX
POP BX
POP ES
RET
DSMS ENDP
;-------------------------------------------
;convert byte in AL to ASCII at DS:[DI]
BTA PROC
PUSH AX
SUB AH,AH
AAM
ADD AX,3030H
MOV [DI],AH
MOV [DI+1],AL
POP AX
RET
BTA ENDP
;-------------------------------------------
;write and verify a sector with retries
WRITSEC PROC
PUSH BX
MOV RETRY_COUNT,5
WRSEC1:
MOV DL,DRIVE
MOV DH,HEAD
MOV CL,SECT
MOV CH,CYL
POP BX
PUSH BX
MOV AL,1
MOV AH,3
CLD
CALL DSMS
INT 13H
JNC WRSEC3
WRSEC2:
DEC RETRY_COUNT
CMP RETRY_COUNT,0
JNE WRSEC1
POP BX
STC
RET
;verify sector
WRSEC3:
MOV DL,DRIVE
MOV DH,HEAD
MOV CL,SECT
MOV CH,CYL
POP BX
PUSH BX
MOV AL,1
MOV AH,4
CLD
CALL DSMS
INT 13H
JC WRSEC2
POP BX
CLC
RET
WRITSEC ENDP
;-------------------------------------------
GO:
PUSH DS
CLI
POP SS
MOV SP,OFFSET STKTOP
STI
;display logo
MOV DX,OFFSET LOGO
MOV AH,9
INT 21H
;scan command line for drive letter
MOV SI,80H
SUB CH,CH
MOV CL,[SI]
INC SI
INC SI
CMP CX,3
JB CLERR
SUB CX,2
CLSCL:
CMP WORD PTR [SI],3A41H
JE DRV0
CMP WORD PTR [SI],3A61H
JE DRV0
CMP WORD PTR [SI],3A42H
JE DRV1
CMP WORD PTR [SI],3A62H
JE DRV1
LOOP CLSCL
;command line error
CLERR:
MOV DX,OFFSET MSG6
MOV AH,9
INT 21H
MOV AX,4C00H
INT 21H
;drive 0 (A:)
DRV0:
MOV DRIVE,0
JMP RDBOOTIMG
;drive 1 (B:)
DRV1:
MOV DRIVE,1
;read boot sector from current drive
RDBOOTIMG:
MOV AH,19H
INT 21H
MOV BX,OFFSET BOOTIMG
MOV CX,1
MOV DX,0
INT 25H
ADD SP,2
JNC DRIVINIT
MOV DX,OFFSET MSG5
MOV AH,9
INT 21H
MOV AX,4C01H
INT 21H
;initialize the floppy drive (clear change line)
DRIVINIT:
MOV DX,OFFSET MSG7
MOV AH,9
INT 21H
MOV AH,0
INT 16H
CMP AL,1BH
JNE DRVINIT1
MOV AX,4C00H
INT 21H
DRVINIT1:
MOV AH,0
MOV DL,DRIVE
INT 13H
MOV DL,DRIVE
MOV DH,0
MOV CH,1
MOV CL,1
MOV BX,OFFSET THEEND
CLD
MOV AX,0201H
INT 13H
MOV DL,DRIVE
MOV DH,0
MOV CH,0
MOV CL,1
MOV BX,OFFSET THEEND
CLD
MOV AX,0201H
INT 13H
;grab ctrl-break interrupt
MOV AX,3523H
INT 21H
MOV WORD PTR OLD23,BX
MOV WORD PTR OLD23+2,ES
MOV DX,OFFSET INT23
MOV AX,2523H
INT 21H
;set up new disk_base
SUB AX,AX
MOV ES,AX
MOV BX,78H
LES BX,ES:[BX]
MOV WORD PTR OLD_DISKBASE,BX
MOV WORD PTR OLD_DISKBASE+2,ES
SUB AX,AX
MOV ES,AX
MOV BX,78H
MOV ES:[BX+2],DS
MOV ES:[BX],OFFSET DISKBASE
MOV AX,40H
MOV ES,AX
MOV BX,90H
MOV BYTE PTR ES:[BX],DSM
MOV BX,8BH
MOV BYTE PTR ES:[BX],DSM
MOV BX,41H
MOV BYTE PTR ES:[BX],00H
MOV DX,03F7H
MOV AL,DSM
ROL AL,1
ROL AL,1
AND AL,03H
OUT DX,AL
MOV CYL,0
MOV HEAD,0
;set up sector addresses
FMLOOP:
MOV SI,OFFSET SA
MOV CX,SECPERTRK
SASET: MOV AL,CYL
MOV BYTE PTR [SI],AL
MOV AL,HEAD
MOV BYTE PTR [SI+1],AL
ADD SI,4
LOOP SASET
;display status message
MOV AL,CYL
MOV DI,OFFSET MSG3A
CALL BTA
MOV AL,HEAD
MOV DI,OFFSET MSG3B
CALL BTA
MOV DX,OFFSET MSG3
MOV AH,9
INT 21H
;format a track
MOV RETRY_COUNT,5
BIOSCL1:
MOV DL,DRIVE
MOV DH,HEAD
MOV CL,1
MOV CH,CYL
MOV BX,OFFSET SA
PUSH DS
POP ES
MOV AL,SECPERTRK
MOV AH,5
CLD
CALL DSMS
INT 13H
JNC VFYTRK
DEC_RETRY:
MOV DL,DRIVE
MOV AH,0
CALL DSMS
INT 13H
DEC RETRY_COUNT
CMP RETRY_COUNT,0
JNE BIOSCL1
JMP FMTERR
;verify the track
VFYTRK:
MOV DL,DRIVE
MOV DH,HEAD
MOV CL,1
MOV CH,CYL
MOV BX,OFFSET THEEND
MOV AL,SECPERTRK
MOV AH,2
CLD
CALL DSMS
INT 13H
JC DEC_RETRY
JMP INCTRK
;bad track - flag clusters in FAT image
FMTERR:
;display message
MOV DX,OFFSET MSG4
MOV AH,9
INT 21H
;read sectors one at a time to find bad ones
MOV SECT,1
READSINGLE:
MOV DL,DRIVE
MOV DH,HEAD
MOV CL,SECT
MOV CH,CYL
MOV BX,OFFSET THEEND
MOV AL,1
MOV AH,2
CLD
CALL DSMS
INT 13H
JNC NSSECT
;compute sector number
MOV AL,CYL
MOV CL,SECPERTRK*2
MUL CL
MOV CL,SECT
DEC CL
SUB CH,CH
ADD AX,CX
CMP HEAD,0
JE CCN
ADD AX,SECPERTRK
;compute cluster number
CCN:
SUB AX,RESERVEDSEC
SUB AX,NMBROFFATS*SECPERFAT
SUB AX,(ROOTENTRIES*32)/BYTESPERSEC
SUB DX,DX
MOV CX,SECPERCLUS
DIV CX
ADD AX,2
;compute offset into table
MOV CL,1
AND CL,AL
SHL CL,1
SHL CL,1
MOV DX,AX
SHR AX,1
ADD AX,DX
;write FF7's
MOV BX,OFFSET FAT
ADD BX,AX
MOV AX,0FF7H
SHL AX,CL
OR [BX],AX
;next sector on track
NSSECT:
INC SECT
CMP SECT,SECPERTRK
JBE READSINGLE
;increment to next track
INCTRK:
CMP BREAK,1
JNE INCHEAD
JMP BREAKEXIT
INCHEAD:
INC HEAD
CMP HEAD,1
JA INCTRK2
JMP FMLOOP
INCTRK2:
MOV HEAD,0
INC CYL
CMP CYL,CYLPERDSK
JNB SENDLF
JMP FMLOOP
;display CRLF
SENDLF:
MOV DX,OFFSET CRLF
MOV AH,9
INT 21H
;plug in correct media parameters
MOV BX,OFFSET BOOTIMG
MOV WORD PTR [BX+11],BYTESPERSEC
MOV BYTE PTR [BX+13],SECPERCLUS
MOV WORD PTR [BX+14],RESERVEDSEC
MOV BYTE PTR [BX+16],NMBROFFATS
MOV WORD PTR [BX+17],ROOTENTRIES
MOV WORD PTR [BX+19],SECPERDISK
MOV BYTE PTR [BX+21],DESCRIPTOR
MOV WORD PTR [BX+22],SECPERFAT
MOV WORD PTR [BX+24],SECPERTRK
MOV WORD PTR [BX+26],NMBROFHEADS
MOV WORD PTR [BX+28],HIDDENSEC
;write diskette boot sector
PUSH DS
POP ES
MOV CYL,0
MOV HEAD,0
MOV SECT,1
MOV BX,OFFSET BOOTIMG
CALL WRITSEC
JC FATALERR
CMP BREAK,1
JE BREAKEXIT
;write first copy of FAT
MOV SECT,2
MOV BX,OFFSET FAT
CALL WRITSEC
JC FATALERR
ADD BX,512
MOV SECT,3
CALL WRITSEC
JC FATALERR
ADD BX,512
MOV SECT,4
CALL WRITSEC
JC FATALERR
CMP BREAK,1
JE BREAKEXIT
;write second copy of FAT
MOV SECT,5
MOV BX,OFFSET FAT
CALL WRITSEC
JC FATALERR
ADD BX,512
MOV SECT,6
CALL WRITSEC
JC FATALERR
ADD BX,512
MOV SECT,7
CALL WRITSEC
JC FATALERR
CMP BREAK,1
JE BREAKEXIT
;display "ok"